package com.gengzp.common.utils;

import com.gengzp.common.exception.BusinessException;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import static com.gengzp.common.constants.DatePatternConstants.*;

/**
 * @ClassName DateUtils
 * @Description 日期工具类
 * @Author gengzp
 * @Date 2025/8/5 13:53
 */
public class DateUtils {

    /**
     * SimpleDateFormat 映射
     * key:     日期格式字符串
     * value:   SimpleDateFormat实例
     */
    private static final Map<String, SimpleDateFormat> SDF_MAP = new HashMap<>();

    static {
        SDF_MAP.put(YMD_PATTERN, new SimpleDateFormat(YMD_PATTERN));
        SDF_MAP.put(YMD_HMS_PATTERN, new SimpleDateFormat(YMD_HMS_PATTERN));
        SDF_MAP.put(YMD_HMS_MS_PATTERN, new SimpleDateFormat(YMD_HMS_MS_PATTERN));
    }

    /**
     * 将时间字符串转为Date类型 (默认为 yyyy-MM-dd 格式)
     *
     * @param dateStr 字符串
     * @return Date类型时间
     */
    public static Date Str2Date(String dateStr) {
        return DateUtils.Str2Date(dateStr, YMD_PATTERN);
    }

    /**
     * 将时间字符串转为Date类型, 指定格式
     *
     * @param dateStr 字符串
     * @param pattern 时间格式
     * @return Date类型时间
     */
    public static Date Str2Date(String dateStr, String pattern) {
        if (StringUtils.isBlank(dateStr)) {
            throw BusinessException.get("时间字符串不能为空");
        }
        if (StringUtils.isBlank(pattern)) {
            throw BusinessException.get("时间格式不能为空");
        }
        try {
            return SDF_MAP.get(pattern).parse(dateStr);
        } catch (Exception e) {
            throw BusinessException.get("时间格式转换异常, " + e.getMessage());
        }
    }

    /**
     * 将日期转换为字符串类型 (默认为 yyyy-MM-dd 格式)
     *
     * @param date 时间
     * @return 时间字符串
     */
    public static String Date2Str(Date date) {
        return Date2Str(date, YMD_PATTERN);
    }

    /**
     * 将日期转换为字符串类型
     *
     * @param date    时间
     * @param pattern 时间格式
     * @return 时间字符串
     */
    public static String Date2Str(Date date, String pattern) {
        if (Objects.isNull(date)) {
            throw BusinessException.get("时间对象不能为空");
        }
        if (StringUtils.isBlank(pattern)) {
            throw BusinessException.get("时间格式不能为空");
        }
        try {
            return SDF_MAP.get(pattern).format(date);
        } catch (Exception e) {
            throw BusinessException.get("时间格式转换异常, " + e.getMessage());
        }
    }

}
